package Data_Structure.List.MyList;

import java.util.Arrays;

/**
 * @className: MyArrayList
 * @author: 芃
 * @description: 顺序表->物理地址连续，由数组组成 简易版本
 * @date: 2023/8/16 12:27
 */
public class MyArrayList {
    public int[] array;//数组
    public int usedSize;//有效数据个数
    public int capacity;//数组容量

    //无参构造
    public MyArrayList() {
        this.array = new int[10];
        this.capacity = 10;
    }
    //判断满
    private boolean isFull(){
        return this.usedSize == this.capacity;
    }

    //判断空
    private boolean isEmpty(){
        return this.usedSize == 0;
    }

    //数组扩容
    private void grow(){
        this.array = Arrays.copyOf(this.array,2*this.capacity);
        this.capacity = array.length;
    }
    //打印顺序表
    public void print(){
        if (isEmpty()){
            System.out.println("顺序表为空，无法打印数据~");
        }else{
            for (int i = 0; i < usedSize; i++) {
                System.out.print(this.array[i] + " ");
            }
            System.out.println();
        }
    }

    //在index位置新增元素
    public void setIndexValue(int index,int value){
        if (index < 0 || index > usedSize){
            System.out.println("Index位置不合法~");
        }else {
            if (isFull()){
                grow();//扩容
            }
            //移动元素
            for (int i = usedSize; i > index; i--) {
                array[i] = array[i-1];
            }
            //放置元素
            array[index] = value;
            usedSize++;
        }
    }

    //判断是否包含某个元素
    public boolean isContain(int key){
        for (int i = 0; i < usedSize; i++) {
            if(this.array[i] == key){
                return true;
            }
        }
        return false;
    }

    //查找某个元素的位置
    public int getValueIndex(int key){
        if (isEmpty()){
            return -1;//数组为空，返回-1下标
        }else{
            for (int i = 0; i < usedSize; i++) {
                if (this.array[i] == key){
                    return i;
                }
            }
        }
        //数组遍历完了仍没有返回下标，说明不存在，则返回-1
        return -1;
    }

    //获取index下表的元素
    public int getValueByIndex(int index){
        if (index < 0 || index >= usedSize){
            System.out.println("数组下标不合法~");
            return -1;
        }
        if (isEmpty()){
            System.out.println("顺序表为空~");
            return -1;//数组为空
        }else{
            return array[index];
        }
    }

    //将index位置的元素改为value
    public void change(int index,int value){
        if (index < 0 || index >= usedSize){
            System.out.println("Index位置非法~");
        }else{
            array[index] = value;
        }
    }

    //获取顺序表的有效数据个数
    public int getLength(){
        return this.usedSize;
    }

    //删除第一次出现的关键字key
    public void delete(int key){
        //判空
        if (isEmpty()){
            System.out.println("数组为空，无法删除~");
            return;
        }
        //查找要删除的数字的下标
        int index = getValueIndex(key);
        if (index == -1){
            System.out.println("没有你要删除的数字~");
            return;
        }
        //移动元素
        for (int i = index; i < usedSize - 1; i++) {
            array[i] = array[i+1];
        }
        //元素有效个数-1
        usedSize--;
        array[usedSize] = 0;
        //如果数组当中存放的是引用类型，那么此时就需要手动置空
    }

    //清空顺序表
    public void clear(){
        this.usedSize = 0;
    }
}
